package com.ssm.controller;

import com.ssm.dto.ImageDTO;
import com.ssm.dto.ListDTO;
import com.ssm.entity.Chair;
import com.ssm.service.IChairService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.UUID;

@Controller
@RequestMapping("/file")
public class FileController {
    private static final String IMG_ROOT_PATH = "upload";
    @Autowired
    private IChairService iChairService;

    /**
     * 上传文件成功后跳转页面
     * 代码实现思路: 1.接收参数 (使用MultipartFile接口去接收到数据)
     * 2.处理文件思路步骤:
     *      2.1找到在服务器中存储的路径(MultipartFile中自带有字节流) : tomcat 第三方[图片服务器]
     *      2.2 为这个文件取名 [防止同名的图片 多次上传]
     *      2.3 将上传的文件流  userimg ==> [转换/拷贝] ==> 新的路径和名字 ==>产生新的文件
     * 3.获取并返回图片路径  存储对象到数据库当中  方便后续的访问
     */
    @ResponseBody
    @PostMapping("upload")
    public ImageDTO upload(ListDTO listDTO, MultipartFile file, HttpServletRequest request) {

        String urlpath = null;
        // 判断userimg是否为空
        if (file != null) {
            File newFile = getFile(file, request);
            // 将 userimg 拷贝到 新文件  获取新文件
            try {
                file.transferTo(newFile);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //获取/返回  图片路径
            urlpath = newFile.getAbsolutePath().substring(newFile.getAbsolutePath().indexOf(IMG_ROOT_PATH));
            System.out.println(urlpath);
        }
        // 将文件的路径存储到 数据库  存储的是url 存储的绝对路径只要从当前项目后的upload文件夹开始取
        listDTO.setChSrc(urlpath);
        int i = iChairService.setSrc(listDTO);

        //配置了前后缀返回页面
        ImageDTO imageDTO = new ImageDTO(0, "");
        Map<String, Object> map = imageDTO.getData();
        map.put("src", urlpath);
        map.put("num", i);

        return imageDTO;
    }

    /**
     * 获取新的文件名
     * @param userimg
     * @param request
     * @return
     */
    private File getFile(MultipartFile userimg, HttpServletRequest request) {
        // 1.获取服务器上真实的路径
        String realPath = request.getServletContext().getRealPath("/" + IMG_ROOT_PATH);
        // 2. 查看真实路径是否存在
        File file = new File(realPath);
        // 2.1 如果路径不存在 自动创建
        if (!file.exists()) {
            //mkdirs可以生成多层级 mkdir只能生成单层级
            file.mkdirs();
        }
        // 3.取名  唯一性 UUID
        // 3.1前缀
        String fileName = UUID.randomUUID().toString().replace("-", "");
        // 获取到上传时的文件的原始的文件名
        String oldFileName = userimg.getOriginalFilename();
        // 3.2后缀
        String suffixName = oldFileName.substring(oldFileName.lastIndexOf("."));
        // 3.3 拼接新文件名
        String newName = fileName + suffixName;
        // 4 指定路径 并且 产生新的文件名 因为新文件在当前层级之下 所以还需要加分隔符
        return new File(realPath + File.separator + newName);
    }
}
